const https = require("https");
const fs = require("fs");
const path = require("path");
const url = require("url");

class Utils {
  constructor() {}

  // 创建目录
  //根据传入的url，创建出该url中的path包含的所有文件夹
  //dest是目标文件夹，新生成的文件夹会放在里面
  async createDirAccordingToUrl(originurl, dest) {
    const urlobj = url.parse(originurl);

    // 提取路径部分（不含文件名）
    const pathOnly = urlobj.pathname.replace(/\/\//g, "/");
    const dirs = pathOnly.split("/");

    let currentDir = dest;

    try {
      for (let i = 1; i < dirs.length; i++) {
        // 跳过最后一级（文件名）
        if (i === dirs.length - 1) break;

        currentDir = path.join(currentDir, dirs[i]);
        if (!fs.existsSync(currentDir)) {
          console.log(`创建目录: ${currentDir}`);
          fs.mkdirSync(currentDir);
        } else {
          console.log(`目录已存在: ${currentDir}`);
        }
      }
    } catch (err) {
      console.error("创建目录失败", err);
      throw err;
    }
  }

  // 下载图片
  async downloadImage(allFilms, dest) {
    const dir = path.join(dest, "images");
    await this.createDirAccordingToUrl(`./images/time/img`, dir);

    try {
      const downloadPromises = allFilms.map((film, index) => {
        return this.downloadSingleImage(
          film.pic,
          path.join(dir, `${new Date().getTime() + index}.png`)
        );
      });

      await Promise.all(downloadPromises);
      console.log("所有图片下载完成！");
    } catch (err) {
      console.error("图片下载失败", err);
    }
  }

  // 下载单个图片
  downloadSingleImage(picUrl, filePath) {
    return new Promise((resolve, reject) => {
      https
        .get(picUrl, (res) => {
          res.setEncoding("binary"); // 设置编码
          let data = "";

          res.on("data", (chunk) => {
            data += chunk;
          });

          res.on("end", () => {
            fs.writeFile(filePath, data, "binary", (err) => {
              if (err) {
                reject(`图片下载失败：${filePath}`);
              } else {
                console.log(`图片下载成功：${filePath}`);
                resolve();
              }
            });
          });
        })
        .on("error", reject);
    });
  }

  // 请求 url -> 下载文件
  async writeFs(fileNameUrl = "./data.json", totalData) {
    try {
      await fs.promises.writeFile(fileNameUrl, JSON.stringify(totalData));
      console.log("数据保存成功");
    } catch (err) {
      console.error("保存数据失败", err);
      throw err;
    }
  }

  // 创建文件夹
  createFile(dirName) {
    try {
      fs.mkdirSync(dirName, { recursive: true }); // 创建文件夹，如果不存在
      console.log(`文件夹创建成功：${dirName}`);
    } catch (err) {
      console.error("创建文件夹失败", err);
      throw err;
    }
  }
}

module.exports = new Utils();
